package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.apis.article.IArticleClient;
import com.heima.apis.wemedia.IWemediaClient;
import com.heima.common.constants.user.UserConstants;
import com.heima.model.atricle.pojos.ApAuthor;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.pojos.ApUserRealname;
import com.heima.model.user.dtos.AuthDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.model.wemedia.pojos.WmUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.ApUserRealnameService;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Transactional
@Service
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname>  implements ApUserRealnameService {


    @Override
    public ResponseResult list(AuthDto dto) {
        //1.判断参数
        if(dto==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        //2.检查分页参数设置默认值
        dto.checkParam();

        //3.判断状态如果有值，就拼接查询条件
        LambdaQueryWrapper<ApUserRealname> lambdaQueryWrapper = new LambdaQueryWrapper();
        if(dto.getStatus()!=null){
            lambdaQueryWrapper.eq(ApUserRealname::getStatus, dto.getStatus()); //根据状态查询
        }

        //4.执行分页查询
        Page<ApUserRealname> page = new Page<>(dto.getPage(), dto.getSize());
        this.page(page,lambdaQueryWrapper);

        //5.封装分页响应结果
        ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(),(int)page.getTotal());
        responseResult.setData(page.getRecords());


        //6.响应数据
        return responseResult;
    }

    @Autowired
    private ApUserMapper apUserMapper;

    /**
     * 用户认证信息审核
     * @param dto
     * @param status 2-审核失败  9-审核通过
     * @return
     */
    @GlobalTransactional
    @Override
    public ResponseResult auth(AuthDto dto, Short status) {
        //第一部分：准入判断

        //1.1 判断参数合法性
        if(dto==null || dto.getId()==null || dto.getId()==0 || status==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        //1.2 根据ID查询认证信息并判断是否存在
        ApUserRealname apUserRealname = getById(dto.getId());
        if(apUserRealname==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "认证信息不存在");
        }

        //1.3 根据用户ID查询APP用户信息判断是否存在
        ApUser apUser = apUserMapper.selectById(apUserRealname.getUserId());
        if(apUser==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "APP用户不存在");
        }

        //1.4 判断当前认证信息是否审核过
        if(apUserRealname.getStatus().equals(UserConstants.PASS_AUTH) || apUserRealname.getStatus().equals(UserConstants.FAIL_AUTH)){
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIC_ERROR, "不要重复审核");
        }


        //第二部分：修改用户认证状态
        ApUserRealname apUserRealnameDB = new ApUserRealname();
        apUserRealnameDB.setId(apUserRealname.getId()); //更新条件
        //2.1 设置用户要修改的值（状态、驳回原因等）
        apUserRealnameDB.setStatus(status); //认证信息状态
        apUserRealnameDB.setUpdatedTime(new Date()); //更新时间
        if(StringUtils.isNotBlank(dto.getMsg())){
            apUserRealnameDB.setReason(dto.getMsg());//设置驳回原因
        }

        //2.2 根据ID修改认证信息
        updateById(apUserRealnameDB);


        //第三部分：判断如果当前是审核通过，就执行三步操作（创建自媒体用户+创建作者+修改APP用户标识）
        if(status.equals(UserConstants.PASS_AUTH)){

            ResponseResult responseResult = createWmUserAndApAuthor(apUser);
            if(responseResult!=null){
                return responseResult;
            }
        }
        //int i = 1/0;
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    @Autowired
    private IWemediaClient wemediaClient;

    @Autowired
    private IArticleClient articleClient;

    //创建自媒体用户+创建作者+修改APP用户标识
    private ResponseResult createWmUserAndApAuthor(ApUser apUser) {

        /***************创建自媒体用户*********************/

        //判断自媒体用户是否存在
        WmUser wmUser = wemediaClient.findByName(apUser.getName());
        if(wmUser!=null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "不能重复创建自媒体用户");
        }

        //构建自媒体用户实例并保存
        wmUser = new WmUser();
        wmUser.setApUserId(apUser.getId()); //APP用户表ID
        wmUser.setName(apUser.getName());//自媒体用户登录名
        wmUser.setPassword(apUser.getPassword());//自媒体用户登录密码
        wmUser.setPhone(apUser.getPhone());
        wmUser.setImage(apUser.getImage());
        wmUser.setStatus((int)UserConstants.PASS_AUTH);//9 - 正常可用状态
        wmUser.setType(0);//0-个人
        wmUser.setCreatedTime(new Date());//时间
        wemediaClient.save(wmUser);


        /***************创建文章作者*********************/
        //查询作者并判断是否存在
        ApAuthor apAuthor = articleClient.findByUserId(apUser.getId());
        if(apAuthor!=null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "不能重复创建文章作者");
        }
        //构建作者实例并保存
        apAuthor = new ApAuthor();
        apAuthor.setUserId(apUser.getId()); //app用户表ID
        //查询刚保存成功的wmUser
        wmUser = wemediaClient.findByName(apUser.getName());
        apAuthor.setWmUserId(wmUser.getId()); //自媒体用户ID
        apAuthor.setName(apUser.getName());
        apAuthor.setType(2); //2-平台自媒体人
        apAuthor.setCreatedTime(new Date());
        articleClient.save(apAuthor);

        /***************修改APP用户标识为自媒体人*********************/
        ApUser apUserDB = new ApUser();
        apUserDB.setId(apUser.getId());
        apUserDB.setFlag((short)1); //标识为自媒体人
        apUserMapper.updateById(apUserDB);
        //TODO 更新自媒体用户表的文章作者ID
        return null;
    }
}
